import { ref, effectScope } from "vue";
import { piniaSymbol, setActivePinia } from "./rootStore";

export function createPinia() {
    const scope = effectScope(true);
    const state = scope.run(() => ref({})); // 用于存储每个 store 的 state 值
    // scope.stop() 方法可以全部停止响应式

    const _p = []; // 存放插件
    const pinia = {
        use(plugin) {
            _p.push(plugin);
            return this; // 返回本身进行链式调用
        },
        _p,
        _s: new Map(), // 存放所有 store
        _e: scope,
        // install 插件必备方法
        install(app) {
            // 挂载插件使用 pinia 要收集所有 store 信息
            setActivePinia(pinia); // 将 pinia 保存一份到全局变量中(保证路由中可以使用(路由并不是组件下面方法并不能提供数据))

            // 让所有组件都可以通过 app.inject(piniaSymbol) 使用
            app.provide(piniaSymbol, pinia); // vue3 提供数据出去
            app.config.globalProperties.$pinia = pinia; // vue2 组件实例共享
        },
        state,
    };
    return pinia;
}

// createPinia() 默认是插件具备 install 方法挂载插件
// _s 用来存储  id ==> store
// state 用来存放所有状态
// _e 用来停止所有状态
